home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Electronic Clipper 1995 April
/
Electronic Clipper 1995-04.iso
/
pc
/
pc_users
/
ideasrc
/
setup
/
pviewer
/
framewnd.c
< prev
next >
Wrap
Text File
|
1993-04-17
|
40KB
|
1,007 lines
// ---------------------------------------------------------------------
//
// FrameWnd.c - Picture Viewer - QuickTime for Windows
//
// Version 1.0
//
// (c) 1988-1992 Apple Computer, Inc. All Rights Reserved.
//
// ---------------------------------------------------------------------
// Includes
// --------
#define NOMINMAX
#include <Windows.H> // Required by Windows
#include <commdlg.h> // Header file for common dlgs
#include <dlgs.h> // Header file for common dlgs ids
#include <cderr.h> // Header file for error ids
#include <memory.h> // Needed for memset() function
#include <shellapi.h> // Drag and drop stuff
#include <qtole.h> // Interface to qtole dll
#include "common.h" // Interface to common.c
#include "viewer.h" // Interface to other *.c files
#include "viewer.hr" // Defines used in *.rc files
#include "picture.h" // Interface to other *.c files
// Message-Persistent Data
// -----------------------
static struct // Hungarian notation: g
{ HWND hwndClient; // MDI client window
WORD wNumPictures; // Number of picture wnds
BOOL bUserAbortPrint; // User abort print flag
HWND hwndCancelPrt; // Handle of print cancel dlg
HBITMAP hAboutBitmap; // Temp static storage of bitmap
// displayed in about dialogs
} g;
// Exported callback functions
// ----------------------------
BOOL __export CALLBACK AboutDlgProc (HWND, UINT, WPARAM, LPARAM);
BOOL __export CALLBACK CloseEnumProc (HWND, LPARAM);
BOOL __export CALLBACK PaletteEnumProc (HWND, LPARAM);
BOOL __export CALLBACK PrintCancelDlgProc (HWND, UINT, WPARAM, LPARAM);
int __export CALLBACK PrintAbortProc (HDC, int);
UINT __export CALLBACK PrintDlgHookProc (HWND, UINT, WPARAM, LPARAM);
// Internal Function Declarations
// ------------------------------
static LONG NEAR ViewerFrameCreate (HWND);
static LONG NEAR ViewerFileCommands (HWND, WPARAM, WORD);
static LONG NEAR ViewerWindowCommands (HWND, WPARAM, WORD);
static LONG NEAR ViewerHelpCommands (HWND, WPARAM, WORD);
static LONG NEAR LaunchPictureWnd (LPSTR, LPSTR);
static VOID NEAR ViewerEnableMenus (HWND, BOOL);
static VOID NEAR TellUserCommonDlgError (DWORD);
static LONG NEAR ProcessDroppedFiles (HWND, WPARAM );
static VOID NEAR DestroyHelpInstance (HWND);
// -----------------------------------------------------------------------
// Function: ViewerFrameWndProc - Viewer Frame Window Procedure
// --------------------------------------------------------------------
// Parameters: As required by Microsoft Windows
//
// Returns: Via DefFrameProc
// --------------------------------------------------------------------
LONG __export CALLBACK ViewerFrameWndProc
(HWND hwndFrame, UINT message, WPARAM wParam, LPARAM lParam)
{WNDENUMPROC lpfnEnumPictures; // -> callback funcion for
// enumeration of pictures
HWND hwndPicture; // Temp handle of active picture wnd
LPQTOLE_OLEDATA lpOleData; // -> to OLE data
switch( message )
{case WM_CREATE:
return ViewerFrameCreate( hwndFrame );
case WM_PALETTECHANGED:
if( g.wNumPictures &&
( lpfnEnumPictures = (WNDENUMPROC) MakeProcInstance
( (FARPROC) PaletteEnumProc, ViewerQueryInstance())))
{StoreCurrentSystemPalette( NULL );
// Tell the picture wnds to repaint themselves
EnumChildWindows( g.hwndClient, lpfnEnumPictures,
(LPARAM) wParam);
FreeProcInstance( (FARPROC) lpfnEnumPictures );
}
return 0L;
case WM_INITMENUPOPUP:
// Set check marks and enable menu items in popups
if( !(BOOL) HIWORD( lParam ) &&
( hwndPicture = (HWND) SendMessage
( g.hwndClient, WM_MDIGETACTIVE, 0, 0L )) &&
IsWindow( hwndPicture ))
SendMessage( hwndPicture,
WM_VIEWER_INITPOPUPS, wParam, lParam );
return 0L;
case WM_COMMAND:
switch( wParam )
{case VIEWER_FILE_OPEN: // file menu popup
case VIEWER_FILE_CLOSE:
case VIEWER_FILE_PRTSETUP:
case VIEWER_FILE_PRINT:
case VIEWER_FILE_EXIT:
return ViewerFileCommands
( hwndFrame, wParam, HIWORD (lParam));
case VIEWER_WINDOW_TILE: // window menu popup
case VIEWER_WINDOW_CASCADE:
case VIEWER_WINDOW_ARRANGE:
return ViewerWindowCommands
( hwndFrame, wParam, HIWORD (lParam));
case VIEWER_HELP_VIEWERHELP: // help menu popup
case VIEWER_HELP_USINGHELP:
case VIEWER_HELP_ABOUTVIEWER:
return ViewerHelpCommands
( hwndFrame, wParam, HIWORD (lParam));
default:
if( ( hwndPicture = (HWND) SendMessage
( g.hwndClient, WM_MDIGETACTIVE, 0, 0L )) &&
IsWindow( hwndPicture ))
SendMessage( hwndPicture,
WM_COMMAND, wParam, lParam );
break; // break to DefFrameProc
}
break;
// WM_USER messages
case WM_VIEWER_CMDLINE:
return LaunchPictureWnd( (LPSTR) lParam, NULL );
case WM_VIEWER_PICTUREDELETED:
// Decrement picture count. This is incremented in LaunchPictureWnd
// when picture is created
if( --g.wNumPictures <= 0 )
ViewerEnableMenus( hwndFrame, FALSE );
return 0L;
// These next messages are posted by the ole callback function in PictUtl.c
case WM_VIEWER_OLE_OPTIONSDLG:
ViewerGetOptions( NULL, (LPQTOLE_OPTIONSPICTURE) lParam );
return 0L;
case WM_VIEWER_OLE_PLAYOBJECT:
QTOLE_PlayObject( ViewerQueryOleData(), lParam );
return 0L;
// end WM_USER messages
// Standard drag and drop processing. Allows for multiple pictures but
// does not worry about position of drop
case WM_DROPFILES:
return ProcessDroppedFiles( hwndFrame, wParam );
case WM_QUERYENDSESSION:
case WM_CLOSE:
if( g.wNumPictures &&
( lpfnEnumPictures = (WNDENUMPROC) MakeProcInstance
( (FARPROC) CloseEnumProc, ViewerQueryInstance())))
{ // Give all pictures a chance to stop the close
EnumChildWindows( g.hwndClient, lpfnEnumPictures, 0L );
FreeProcInstance( (FARPROC) lpfnEnumPictures );
// If someone didn't want to close, don't kill the app
if( NULL != GetWindow( g.hwndClient, GW_CHILD ))
return 0L;
}
// Tell qtole.dll that we are closing the server
// Don't close if QTOLE_ClosingServerWnd returns FALSE;
if( ( lpOleData = ViewerQueryOleData()) &&
lpOleData->lpqtoleServer &&
!QTOLE_ClosingServerWnd( lpOleData, message ))
return 0L;
break; // break to DefFrameProc
case WM_NCDESTROY:
DragAcceptFiles( hwndFrame, FALSE );
// Destroy help instance
DestroyHelpInstance( hwndFrame );
// NULL the global hwnds in viewmain.c
ViewerNoMoreWindow();
PostQuitMessage( 0 );
break;
}
return DefFrameProc
( hwndFrame, g.hwndClient, message, wParam, lParam );
}
// Function: ViewerFrameCreate - process WM_CREATE message
// --------------------------------------------------------------------
// Parameters: HWND hwndFrame; Frame window
//
// Returns: 0L if OK, else returns -1L to kill app
// --------------------------------------------------------------------
static LONG NEAR ViewerFrameCreate( HWND hwndFrame )
{CLIENTCREATESTRUCT clientcreate; // MDI client create struct
char szCaption[50]; // caption buffer;
szCaption[0] = '\0';
if( LoadString( ViewerQueryResources(), VIEWER_STRING_CAPTION,
szCaption, sizeof( szCaption )))
SetWindowText( hwndFrame, szCaption );
// No point in trying for an error message here since it probably won't
// load either.
// disable menu items until a picture is created
g.wNumPictures = 0;
ViewerEnableMenus( hwndFrame, FALSE );
DragAcceptFiles( hwndFrame, TRUE );
clientcreate.hWindowMenu =
GetSubMenu( GetMenu( hwndFrame ), MENU_WINDOW_POS );
clientcreate.idFirstChild = VIEWER_CLIENT_FIRSTCHILD;
if( !(g.hwndClient = CreateWindow( "MDICLIENT", NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE |
WS_HSCROLL | WS_VSCROLL ,
0, 0, 0, 0, hwndFrame, ( HMENU) 1,
ViewerQueryInstance(), (LPVOID) &clientcreate )))
return -1L; // return -1 to kill app
else
return 0L;
}
// Function: ViewerFileCommands - Process WM_COMMAND, File popup messages
// --------------------------------------------------------------------
// Parameters: HWND hwndFrame; Frame window
// WORD wIDItem; Menu or control id
// WORD wNotifyCode; notification message
//
// Returns: LONG generally 0L
// --------------------------------------------------------------------
static LONG NEAR ViewerFileCommands
(HWND hwndFrame, WPARAM wIDItem, WORD wNotifyCode )
{HWND hwndPicture; // Handle of picture window
OPENFILENAME ofn; // OPENFILENAME struct
UINT cbString; // Length of filter string
char szPicturePath[MAX_PATH_LEN]; // Picture file path.
// Must be at least 256 bytes
char szPictureName[MAX_NAME_LEN]; // Picture file name
char szFilter[MAX_PATH_LEN]; // Picture file filter str
LPSTR lpTemp; // Temp -> to string
LPSTR lpSave; // Temp -> to string
char chReplace; // String separator used in filter string
DWORD dwError; // Common dlg error return
PRINTDLG pd; // Print common dlg struct
ABORTPROC lpPrintAbortProc; // -> to Print abort proc
DLGPROC lpPrtCancelProc; // -> to Print cancel dlg proc
WORD wIDError; // Resource error string id
int nError; // Error return
static DWORD dwFilterIndex = 1; // Filter index. Saved between
// invocations of dialog
typedef UINT ( CALLBACK * PRINTDLGHOOKPROC ) (HWND, UINT, WPARAM, LPARAM );
switch( wIDItem )
{case VIEWER_FILE_OPEN:
memset( &ofn, 0, sizeof( OPENFILENAME ));
szPicturePath[0] = '\0';
if( !(cbString = LoadString( ViewerQueryResources(),
VIEWER_STRING_OPENPICTFILTER,
szFilter, sizeof( szFilter ))))
return 0L;
// See 3.1 SDK manuals, vol 1 for examples of common dlg processing
lpTemp = szFilter + lstrlen( szFilter );
chReplace = *AnsiPrev( szFilter, lpTemp );
lpTemp = szFilter;
while( *lpTemp )
{if( *lpTemp == chReplace )
{ // Need to increment pointer past chReplace before
// setting to NULL. Otherwise AnsiNext thinks it is
// at end of string and quits
lpSave = lpTemp;
lpTemp = AnsiNext( lpTemp );
*lpSave = '\0';
}
else
lpTemp = AnsiNext( lpTemp );
}
ofn.lStructSize = sizeof( OPENFILENAME );
ofn.hwndOwner = hwndFrame;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = dwFilterIndex;
ofn.lpstrFile = szPicturePath;
ofn.nMaxFile = sizeof( szPicturePath );
ofn.lpstrFileTitle = szPictureName;
ofn.nMaxFileTitle = sizeof( szPictureName );
ofn.Flags =
OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if( GetOpenFileName( &ofn ))
{ // Save the current filter index
dwFilterIndex = ofn.nFilterIndex;
LaunchPictureWnd( szPicturePath, szPictureName );
}
else if( dwError = CommDlgExtendedError())
{ // Tell the user about the error
TellUserCommonDlgError( dwError );
}
return 0L;
case VIEWER_FILE_CLOSE:
if( ( hwndPicture = (HWND) SendMessage
( g.hwndClient, WM_MDIGETACTIVE, 0, 0L )) &&
IsWindow( hwndPicture ))
SendMessage( hwndPicture, WM_CLOSE, 0, 0L );
return 0L;
case VIEWER_FILE_PRTSETUP:
memset( &pd, 0, sizeof( PRINTDLG ));
pd.lStructSize = sizeof( PRINTDLG );
pd.hwndOwner = hwndFrame;
pd.Flags = PD_PRINTSETUP;
if( ( PrintDlg( &pd ) == 0 ) &&
( dwError = CommDlgExtendedError()))
{ // Tell the user about the error
TellUserCommonDlgError( dwError );
}
return 0L;
case VIEWER_FILE_PRINT:
// Customize the common dlg to eliminate some options that are
// not useful. This requires a new template and a hook proc
memset( &pd, 0, sizeof( PRINTDLG ));
pd.lStructSize = sizeof( PRINTDLG );
pd.hwndOwner = hwndFrame;
pd.Flags = PD_RETURNDC |
PD_ENABLEPRINTHOOK | PD_ENABLEPRINTTEMPLATE;
pd.hInstance = ViewerQueryResources();
pd.lpPrintTemplateName = MAKEINTRESOURCE( CUSTOM_DLG_COMN_PRINT );
if( !( pd.lpfnPrintHook = (PRINTDLGHOOKPROC)
MakeProcInstance( (FARPROC) PrintDlgHookProc,
ViewerQueryInstance())))
{CommonTellUser( ViewerQueryResources(),
VIEWER_STRING_NOMEMORY, NULL, MB_OK );
return 0L;
}
if( PrintDlg( &pd ) != 0 )
{lpPrtCancelProc = (DLGPROC) MakeProcInstance
( (FARPROC) PrintCancelDlgProc, ViewerQueryInstance() );
lpPrintAbortProc = (ABORTPROC) MakeProcInstance
( (FARPROC) PrintAbortProc, ViewerQueryInstance() );
if( !lpPrtCancelProc || !lpPrintAbortProc )
{CommonTellUser( ViewerQueryResources(),
VIEWER_STRING_NOMEMORY, NULL, MB_OK );
return 0L;
}
g.bUserAbortPrint = FALSE;
nError = 0;
wIDError = 0;
if( !(g.hwndCancelPrt =
CreateDialog( ViewerQueryResources(),
MAKEINTRESOURCE( VIEWER_DLG_PRINTCANCEL ),
hwndFrame, lpPrtCancelProc )))
{wIDError = VIEWER_STRING_CANCELDLG;
}
else
{EnableWindow( hwndFrame, FALSE ); // disable frame window
if( SetAbortProc( pd.hDC, lpPrintAbortProc ) <= 0 )
wIDError = VIEWER_STRING_ABORTPROC;
else
{if( hwndPicture = (HWND) SendMessage
( g.hwndClient, WM_MDIGETACTIVE, 0, 0L ))
nError = (int) SendMessage( hwndPicture,
WM_VIEWER_PRINTPICTURE, 0,
(LPARAM) (LPPRINTDLG) &pd );
if( ( nError < 0 ) &&
( nError & SP_NOTREPORTED ) &&
!g.bUserAbortPrint )
{switch( nError )
{case SP_APPABORT:
case SP_USERABORT:
break;
case SP_OUTOFDISK:
wIDError = VIEWER_STRING_PRT_OUTOFDISK;
break;
case SP_OUTOFMEMORY:
wIDError = VIEWER_STRING_PRT_NOMEMORY;
break;
case SP_ERROR: // fall through
default:
wIDError = VIEWER_STRING_PRT_GENERROR;
break;
}
}
}
// reenable frame window
EnableWindow( hwndFrame, TRUE );
if( g.hwndCancelPrt )
DestroyWindow( g.hwndCancelPrt );
}
if( wIDError )
CommonTellUser( ViewerQueryResources(), wIDError,
VIEWER_STRING_PRT_CAPTION, MB_OK );
FreeProcInstance( (FARPROC) lpPrtCancelProc );
FreeProcInstance( (FARPROC) lpPrintAbortProc );
if( pd.hDC )
DeleteDC( pd.hDC );
if( pd.hDevMode != NULL )
GlobalFree( pd.hDevMode );
if( pd.hDevNames != NULL )
GlobalFree( pd.hDevNames );
}
else if( dwError = CommDlgExtendedError())
{ // Tell the user about the error
TellUserCommonDlgError( dwError );
}
return 0L;
case VIEWER_FILE_EXIT:
SendMessage( hwndFrame, WM_CLOSE, 0, 0L );
return 0L;
}
return 0L; // should never get here
}
// Function: ViewerWindowCommands - Process WM_COMMAND, Window popup messages
// --------------------------------------------------------------------
// Parameters: HWND hwndFrame; Frame window
// WORD wIDItem; Menu or control id
// WORD wNotifyCode; notification message
//
// Returns: LONG generally 0L
// --------------------------------------------------------------------
static LONG NEAR ViewerWindowCommands
(HWND hwndFrame, WPARAM wIDItem, WORD wNotifyCode )
// This is standard MDI stuff.
{
switch( wIDItem )
{case VIEWER_WINDOW_TILE:
SendMessage( g.hwndClient, WM_MDITILE, 0, 0L );
return 0L;
case VIEWER_WINDOW_CASCADE:
SendMessage( g.hwndClient, WM_MDICASCADE, 0, 0L );
return 0L;
case VIEWER_WINDOW_ARRANGE:
SendMessage( g.hwndClient, WM_MDIICONARRANGE, 0, 0L );
return 0L;
}
return 0L; // should never get here
}
// Function: ViewerHelpCommands - Process WM_COMMAND, Help popup messages
// --------------------------------------------------------------------
// Parameters: HWND hwndFrame; Frame window
// WORD wIDItem; Menu or control id
// WORD wNotifyCode; notification message
//
// Returns: LONG generally 0L
// --------------------------------------------------------------------
static LONG NEAR ViewerHelpCommands
(HWND hwndFrame, WPARAM wIDItem, WORD wNotifyCode )
{char szHelp[MAX_PATH_LEN]; // Help file path
DLGPROC lpDlgProc; // -> dialog proc
switch( wIDItem )
{case VIEWER_HELP_VIEWERHELP:
CommonGetLocalizedHelpFile
( VIEWER_ROOT_NAME, szHelp, ViewerQueryInstance() );
if( szHelp[0] )
WinHelp( hwndFrame, (LPCSTR) szHelp, HELP_CONTENTS, 0L );
else
CommonTellUser( ViewerQueryResources(),
VIEWER_STRING_NOHELPFILE,
VIEWER_STRING_CAPTION, MB_OK );
return 0L;
case VIEWER_HELP_USINGHELP:
WinHelp( hwndFrame, (LPCSTR) "WINHELP.HLP", HELP_CONTENTS, 0L );
return 0L;
case VIEWER_HELP_ABOUTVIEWER:
if( ( g.hAboutBitmap = LoadBitmap( ViewerQueryResources(),
MAKEINTRESOURCE( VIEWER_VIEWER_BITMAP ))) &&
( lpDlgProc = (DLGPROC) MakeProcInstance
( (FARPROC) AboutDlgProc, ViewerQueryInstance())))
{DialogBox( ViewerQueryResources(),
MAKEINTRESOURCE( VIEWER_DLG_ABOUTVIEWER ),
hwndFrame, lpDlgProc );
FreeProcInstance( (FARPROC) lpDlgProc );
}
else
CommonTellUser( ViewerQueryResources(),
VIEWER_STRING_NOMEMORY,
VIEWER_STRING_CAPTION, MB_OK );
if( g.hAboutBitmap )
DeleteObject( g.hAboutBitmap );
g.hAboutBitmap = NULL;
return 0L;
}
return 0L; // should never get here
}
// Function: CloseEnumProc - Close all enumerate proc
// --------------------------------------------------------------------
// Parameters: As required by Microsoft Windows
//
// Returns: Always TRUE to enumerate all windows
// --------------------------------------------------------------------
BOOL __export CALLBACK CloseEnumProc( HWND hwnd, LPARAM lParam )
{char szClassName[40]; // Temp buffer for class name
// Check class name since there are several classes of child windows
// These include scroll bars etc that appear in picture windows
if( !GetClassName( hwnd, szClassName, sizeof( szClassName )) ||
lstrcmpi( szClassName, VIEWER_PICTURE_CLASS ))
return TRUE;
// If someone doesn't want to quit, stop enumeration
if( !SendMessage( hwnd, WM_QUERYENDSESSION, 0, 0L ))
return FALSE;
SendMessage( GetParent( hwnd ), WM_MDIDESTROY, (WPARAM) hwnd, 0L );
return TRUE;
}
// Function: PaletteEnumProc - Tells all child wnds to repaint because
// of palette change
// --------------------------------------------------------------------
// Parameters: As required by Microsoft Windows
//
// Returns: Always TRUE to enumerate all windows
// --------------------------------------------------------------------
BOOL __export CALLBACK PaletteEnumProc( HWND hwnd, LPARAM lParam )
{char szClassName[40]; // Temp buffer for class name
// Check class name since there are several classes of child windows
// These include scroll bars etc that appear in picture windows
if( !GetClassName( hwnd, szClassName, sizeof( szClassName )) ||
lstrcmpi( szClassName, VIEWER_PICTURE_CLASS ))
return TRUE;
if( hwnd != (HWND) LOWORD( lParam ))
InvalidateRect( hwnd, NULL, FALSE );
return TRUE;
}
// Function: LaunchPictureWnd - tell hwndClient to launch a picture wnd
// --------------------------------------------------------------------
// Parameters: LPSTR lpPicturePath Path of picture file
// LPSTR lpName File name of picture
//
// Returns: LONG generally 0L
// --------------------------------------------------------------------
static LONG NEAR LaunchPictureWnd( LPSTR lpPicturePath, LPSTR lpName )
{MDICREATESTRUCT mdicreate; // mdi create struct
HWND hwndPicture; // Temp handle of window
if( !lpPicturePath[0] )
return -1L;
if( lpName == NULL )
{lpName = lpPicturePath + lstrlen( lpPicturePath );
lpName = AnsiPrev( lpPicturePath, lpName );
while( *lpName && (*lpName != '\\') && (lpName != lpPicturePath))
lpName = AnsiPrev( lpPicturePath, lpName );
if( *lpName == '\\' )
lpName = AnsiNext( lpName );
}
mdicreate.szClass = VIEWER_PICTURE_CLASS;
mdicreate.szTitle = lpName;
mdicreate.hOwner = ViewerQueryInstance();
mdicreate.x = CW_USEDEFAULT;
mdicreate.y = CW_USEDEFAULT;
mdicreate.cx = CW_USEDEFAULT;
mdicreate.cy = CW_USEDEFAULT;
mdicreate.style = MDIS_ALLCHILDSTYLES | WS_CLIPCHILDREN;
mdicreate.lParam = (LPARAM) lpPicturePath;
if( !( hwndPicture = (HWND) SendMessage
( g.hwndClient, WM_MDICREATE, 0,
(LPARAM) (LPMDICREATESTRUCT) &mdicreate )))
{return -1L;
}
else
{if(++g.wNumPictures == 1 )
ViewerEnableMenus( ViewerQueryFrameWindow(), TRUE );
return 0L;
}
}
// Function: ProcessDroppedFiles - Process the WM_DROPFILES message
// --------------------------------------------------------------------
// Parameters: HWND hwndFrame Frame window handle
// WPARAM wParam Message wParam
//
// Returns: LONG Always 0L;
// --------------------------------------------------------------------
static LONG NEAR ProcessDroppedFiles( HWND hwndFrame, WPARAM wParam )
{int i; // Temp counter
int nNumFiles; // Temp number of dropped files
UINT uBytes; // Temp len of drop file path
char szDropFile[MAX_PATH_LEN]; // Temp drop file path
if( nNumFiles = DragQueryFile( (HDROP) wParam, 0xffff,
(LPSTR) NULL, 0 ))
{ // Create processing requires that frame window has
// nonzero dimensions so first restore iconic window
if( IsIconic( hwndFrame ))
ShowWindow( hwndFrame, SW_SHOWNORMAL );
for( i=0; i < nNumFiles; i++ )
{uBytes = DragQueryFile( (HDROP) wParam, i,
(LPSTR) szDropFile, sizeof( szDropFile ));
if( uBytes > 0 )
LaunchPictureWnd( szDropFile, NULL );
}
}
DragFinish( (HDROP) wParam );
return 0L;
}
// Function: DestroyHelpInstance - Tell windows that instance is done with
// help. This is called as a function so that
// szHelp[] is not an automatic var. in the
// winproc
// --------------------------------------------------------------------
// Parameters: HWND hwndFrame Frame window handle
//
// Returns: VOID
// --------------------------------------------------------------------
static VOID NEAR DestroyHelpInstance( HWND hwndFrame )
{char szHelp[MAX_PATH_LEN]; // Help file name
WinHelp( hwndFrame, CommonGetLocalizedHelpFile
( VIEWER_ROOT_NAME, szHelp, ViewerQueryResources() ),
HELP_QUIT, NULL );
return;
}
// Function: AboutDlgProc - About dialog proc
// --------------------------------------------------------------------
// Parameters: As required by Microsoft Windows
//
// Returns: As required by Microsoft Windows
// --------------------------------------------------------------------
BOOL __export CALLBACK AboutDlgProc
( HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam )
{BITMAP bm; // Temp bitmap struct
HWND hwndCntrl; // Handle of rect control that is painted
// over with bitmap
HDC hdestDC; // hdc of control rect
HDC hmemDC; // Memory dc
RECT rcdestRect; // Rect of control
HBITMAP hbitmapSave; // return from select object
PAINTSTRUCT ps; // Paint struct
switch( msg )
{case WM_COMMAND:
EndDialog( hdlg, 0 );
return TRUE;
case WM_PAINT:
// Don't bother with error messages since only effect is that
// bitmap will not appear in dialog
if( !BeginPaint( hdlg, &ps ))
return FALSE;
EndPaint( hdlg, &ps );
if( !g.hAboutBitmap ||
!( hwndCntrl = GetDlgItem( hdlg, VIEWER_ABOUT_BMPFRAME )))
return FALSE;
InvalidateRect( hwndCntrl, NULL, TRUE );
UpdateWindow( hwndCntrl );
if( !(hdestDC = GetDC( hwndCntrl )))
return FALSE;
if( hmemDC = CreateCompatibleDC( hdestDC ))
{if( hbitmapSave = SelectObject( hmemDC, g.hAboutBitmap ))
{GetObject( g.hAboutBitmap, sizeof( BITMAP ), &bm );
GetClientRect( hwndCntrl, &rcdestRect );
BitBlt( hdestDC,
( rcdestRect.right - bm.bmWidth ) / 2,
( rcdestRect.bottom - bm.bmHeight ) / 2,
bm.bmWidth, bm.bmHeight, hmemDC, 0, 0, SRCCOPY );
SelectObject( hmemDC, hbitmapSave );
}
DeleteDC( hmemDC );
}
ReleaseDC( hwndCntrl, hdestDC );
return FALSE;
default:
return FALSE;
}
return FALSE;
}
// Function: PrintAbortProc - Print abort proc
// --------------------------------------------------------------------
// Parameters: As required by Microsoft Windows
//
// Returns: As required by Microsoft Windows
// --------------------------------------------------------------------
int __export CALLBACK PrintAbortProc( HDC hdc, int nCode )
{MSG msg; // Message struct
while( !g.bUserAbortPrint &&
PeekMessage( &msg, NULL, NULL, NULL, PM_REMOVE ))
{if( !g.hwndCancelPrt || !IsDialogMessage( g.hwndCancelPrt, &msg ))
{TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return !g.bUserAbortPrint;
}
// Function: PrintCancelDlgProc - User cancel printing dlg proc
// --------------------------------------------------------------------
// Parameters: As required by Microsoft Windows
//
// Returns: As required by Microsoft Windows
// --------------------------------------------------------------------
BOOL __export CALLBACK PrintCancelDlgProc
( HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam )
{char szName[50]; // Buffer for picture name
switch( msg )
{case WM_INITDIALOG:
SetFocus( GetDlgItem( hdlg, IDCANCEL ));
SetDlgItemText( hdlg, PRINT_CANCEL_PICTURENAME,
ViewerQueryActivePictureName( szName ));
return TRUE;
case WM_COMMAND:
return ( g.bUserAbortPrint = TRUE );
case WM_DESTROY:
g.hwndCancelPrt = NULL;
break;
}
return FALSE;
}
// Function: PrintDlgHookProc - Custom print common dlg hook function
// --------------------------------------------------------------------
// Parameters: As required by Microsoft Windows
//
// Returns: As required by Microsoft Windows
// --------------------------------------------------------------------
UINT __export CALLBACK PrintDlgHookProc
(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam )
{ // The dialog ids are defined in dlgs.h
// Array of ids of controls to be hidden
static int nIDs[] = {grp1, rad1, rad2, rad3, stc2, edt1,
stc3, edt2, chx1, chx2, pshHelp };
UINT i; // Temp counter
if( message == WM_INITDIALOG )
{for( i=0; i < ( sizeof( nIDs ) / sizeof( nIDs[0] )); i++ )
ShowWindow( GetDlgItem( hdlg, nIDs[i] ), SW_HIDE );
return TRUE;
}
else
return FALSE;
}
// Function: ViewerEnableMenus - Disables menu items when there
// are no pictures
// --------------------------------------------------------------------
// Parameters: HWND hwndFrame Handle of frame window
// BOOL bEnable Enabling flag
//
// Returns: VOID
// --------------------------------------------------------------------
static VOID NEAR ViewerEnableMenus( HWND hwndFrame, BOOL bEnable )
{UINT fFlag; // Temp enabling flag
HMENU hmenuFrame; // Handle to main menu of frame window
UINT i; // Index
static UINT uMenuIDs[] = {VIEWER_FILE_CLOSE,
VIEWER_FILE_PRINT,
VIEWER_EDIT_COPYPICTURE,
VIEWER_EDIT_OPTIONS,
VIEWER_EDIT_CANCELSEL,
VIEWER_IMAGE_GETINFO,
VIEWER_IMAGE_HALFSIZE,
VIEWER_IMAGE_NORMALSIZE,
VIEWER_IMAGE_DOUBLESIZE,
VIEWER_WINDOW_TILE,
VIEWER_WINDOW_CASCADE,
VIEWER_WINDOW_ARRANGE
};
if( !( hmenuFrame = GetMenu( hwndFrame )))
return;
fFlag = (bEnable ? MF_ENABLED : MF_GRAYED ) | MF_BYCOMMAND;
for( i=0; i < sizeof( uMenuIDs ) / sizeof( uMenuIDs[0] ); i++ )
EnableMenuItem( hmenuFrame, uMenuIDs[i], fFlag );
DrawMenuBar( hwndFrame );
return;
}
// Function: TellUserCommonDlgError - Tell the user about the common dlg
// error
// --------------------------------------------------------------------
// Parameters: DWORD dwError error code returned by common dlg
//
// Returns: VOID
// --------------------------------------------------------------------
static VOID NEAR TellUserCommonDlgError( DWORD dwError )
{WORD wIDErrorString; // String id
// Not much here now, can make this as explicit as desired
// Now returns text of error id, i.e. "CDERR_INITIALIZATION"
// Not all messages are explicitly included
switch( dwError )
{case CDERR_FINDRESFAILURE:
wIDErrorString = VIEWER_STRING_CDLG_FINDRESFAIL;
break;
case CDERR_INITIALIZATION:
wIDErrorString = VIEWER_STRING_CDLG_INITFAIL;
break;
case CDERR_LOADRESFAILURE:
wIDErrorString = VIEWER_STRING_CDLG_LOADRESFAIL;
break;
case CDERR_LOCKRESFAILURE:
wIDErrorString = VIEWER_STRING_CDLG_LOCKRESFAIL;
break;
case CDERR_MEMALLOCFAILURE:
wIDErrorString = VIEWER_STRING_CDLG_MEMALLOCFAIL;
break;
case CDERR_MEMLOCKFAILURE:
wIDErrorString = VIEWER_STRING_CDLG_MEMLOCKFAIL;
break;
case CDERR_STRUCTSIZE:
wIDErrorString = VIEWER_STRING_CDLG_STRUCTSIZE;
break;
case FNERR_INVALIDFILENAME:
wIDErrorString = VIEWER_STRING_CDLG_BADFILENAME;
break;
case PDERR_INITFAILURE:
wIDErrorString = VIEWER_STRING_CDLG_PRTINITFAIL;
break;
case PDERR_LOADDRVFAILURE:
wIDErrorString = VIEWER_STRING_CDLG_LOADDRVFAIL;
break;
case PDERR_NODEFAULTPRN:
wIDErrorString = VIEWER_STRING_CDLG_NODEFPRINTER;
break;
case PDERR_NODEVICES:
wIDErrorString = VIEWER_STRING_CDLG_NODEVICES;
break;
case PDERR_PRINTERNOTFOUND:
wIDErrorString = VIEWER_STRING_CDLG_NOFINDPNTR;
break;
case PDERR_SETUPFAILURE:
wIDErrorString = VIEWER_STRING_CDLG_SETUPFAIL;
break;
default:
wIDErrorString = VIEWER_STRING_CDLG_GENFAILURE;
break;
}
if( wIDErrorString == VIEWER_STRING_CDLG_GENFAILURE )
CommonTellUser( ViewerQueryResources(),
VIEWER_STRING_CDLG_GENFAILURE,
VIEWER_STRING_CDLG_CAP, MB_OK, dwError );
else
CommonTellUser( ViewerQueryResources(),
VIEWER_STRING_CDLG_FORMAT, VIEWER_STRING_CDLG_CAP,
MB_OK, wIDErrorString );
return;
}
// The remaining functions are the query functions called by other modules
// Function: ViewerQueryClientWindow - Query Client Window Handle
// --------------------------------------------------------------------
// Parameters: None.
//
// Returns: HWND g.hwndClient; MDI client window handle
// --------------------------------------------------------------------
HWND FAR ViewerQueryClientWindow( VOID )
{return g.hwndClient;
}
// Function: ViewerQueryNumPictures - Query number of pictures
// --------------------------------------------------------------------
// Parameters: None.
//
// Returns: HWND g.wNumPictures; Number of pictures
// --------------------------------------------------------------------
WORD FAR ViewerQueryNumPictures( VOID )
{return g.wNumPictures;
}